<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <link href='/css/styles.css' rel='stylesheet' type='text/css' />
    <link href='/images/favicon.png' rel='shortcut icon' />
    <script src='/js/jquery.min.1.4.js'></script>
    <script src='/js/app.js'></script>
    <meta content='width=device-width, minimum-scale=1.0, maximum-scale=1.0' name='viewport' />
    <title>Redis数据类型</title>
	<meta http-equiv="description" content="Redis数据类型，介绍redis请求后，响应返回的各种数据类型数据结构格式。" />
	
  </head>
  <body class=''>
    <script src='/js/head.js'></script>
    <div class='text'>
      <article id='topic'>
        <h1>数据类型 Data Types</h1>
        
        <p><a name="strings"></a></p>
        
        <h2>字符串（Strings）</h2>
        
        <p>字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的，这意味着一个Redis字符串能包含任意类型的数据，例如：
        一张JPEG格式的图片或者一个序列化的Ruby对象。</p>
        
        <p>一个字符串类型的值最多能存储512M字节的内容。</p>
        
        <p>你可以用Redis字符串做许多有趣的事，例如你可以：</p>
        
        <ul>
        <li>利用INCR命令簇（<a href="/commands/incr">INCR</a>, <a href="/commands/decr">DECR</a>, <a href="/commands/incrby">INCRBY</a>）来把字符串当作原子计数器使用。</li>
        <li>使用<a href="/commands/append">APPEND</a>命令在字符串后添加内容。</li>
        <li>将字符串作为<a href="/commands/getrange">GETRANGE</a>和<a href="/commands/setrange">SETRANGE</a>的随机访问向量。</li>
        <li>在小空间里编码大量数据，或者使用<a href="/commands/getbit">GETBIT</a>和<a href="/commands/setbit">SETBIT</a>创建一个Redis支持的Bloom过滤器。</li>
        </ul>
        
        
        <p>查看所有可用的<a href="/commands/#string">字符串命令</a>获取更多信息。</p>
        
        <p><a name="lists"></a></p>
        
        <h2>列表（Lists）</h2>
        
        <p>Redis列表是简单的字符串列表，按照插入顺序排序。
        你可以添加一个元素到列表的头部（左边）或者尾部（右边）。</p>
        
        <p><a href="/commands/lpush">LPUSH</a>命令插入一个新元素到列表头部，而<a href="/commands/rpush">RPUSH</a>命令
		插入一个新元素到列表的尾部。当
		对一个空key执行其中某个命令时，将会创建一个新表。
        类似的，如果一个操作要清空列表，那么key会从对应的key空间删除。这是个非常便利的语义，
		因为如果使用一个不存在的key作为参数，所有的列表命令都会像在对一个空表操作一样。</p>
        
        <p>一些列表操作及其结果：</p>
        
        <pre><code>LPUSH mylist a   # now the list is "a"&#x000A;LPUSH mylist b   # now the list is "b","a"&#x000A;RPUSH mylist c   # now the list is "b","a","c" (RPUSH was used this time)&#x000A;</code></pre>
        
        <p>一个列表最多可以包含2<sup>32-1</sup>个元素（4294967295，每个表超过40亿个元素）。</p>
        
        <p>从时间复杂度的角度来看，Redis列表主要的特性就是支持时间常数的
		插入和靠近头尾部元素的删除，即使是需要插入上百万的条目。
        访问列表两端的元素是非常快的，但如果你试着访问一个非常大
		的列表的中间元素仍然是十分慢的，因为那是一个时间复杂度为
        <span class="math">O(N) </span>的操作。</p>
        
        <p>你可以用Redis列表做许多有趣的事，例如你可以：</p>
        
        <ul>
        <li>在社交网络中建立一个时间线模型，使用<a href="/commands/lpush">LPUSH</a>去添加新的元素到用户时间线中，使用<a href="/commands/lrange">LRANGE</a>去检索一些最近插入的条目。</li>
        <li>你可以同时使用<a href="/commands/lpush">LPUSH</a>和<a href="/commands/ltrim">LTRIM</a>去创建一个永远不会超过指定元素数目的列表并同时记住最后的N个元素。</li>
        <li>列表可以用来当作消息传递的基元（primitive），例如，众所周知的用来创建后台任务的<a href="https://github.com/defunkt/resque">Resque</a> Ruby库。</li>
        <li>你可以使用列表做更多事，这个数据类型支持许多命令，包括像<a href="/commands/blpop">BLPOP</a>这样的阻塞命令。请查看所有可用的<a href="/commands#list">列表操作命令</a>获取更多的信息。</li>
        </ul>
        
        
        <p><a name="sets"></a></p>
        
        <h2>集合（Sets）</h2>
        
        <p>Redis集合是一个无序的字符串合集。你可以以<span class="math">O(1) </span>的时间复杂度（无论集合中有多少元素时间复杂度都为常量）完成
		添加，删除以及测试元素是否存在的操作。</p>
        
        <p>Redis集合有着不允许相同成员存在的优秀特性。向集合中多次添加同一元素，在集合中最终只会存在一个此元素。实际上这就意味着，在添加元素前，你并不需要事先进行<em>检验此元素是否已经存在</em>的操作。</p>
        
        <p>一个Redis列表十分有趣的事是，它们支持一些服务端的命令从现有的集合出发去进行集合运算。
		所以你可以在很短的时间内完成合并（union）,求交(intersection),
		找出不同元素的操作。</p>
        
        <p>一个集合最多可以包含2<sup>32-1</sup>个元素（4294967295，每个集合超过40亿个元素）。</p>
        
        <p>你可以用Redis集合做很多有趣的事，例如你可以：</p>
        
        <ul>
        <li>用集合跟踪一个独特的事。想要知道所有访问某个博客文章的独立IP？只要每次都用<a href="/commands/sadd">SADD</a>来处理一个页面访问。那么你可以肯定重复的IP是不会插入的。</li>
        <li>Redis集合能很好的表示关系。你可以创建一个tagging系统，然后用集合来代表单个tag。接下来你可以用<a href="/commands/sadd">SADD</a>命令把所有拥有tag的对象的所有ID添加进集合，这样来表示这个特定的tag。如果你想要同时有3个不同tag的所有对象的所有ID，那么你需要使用<a href="/commands/sinter">SINTER</a>.</li>
        <li>使用<a href="/commands/spop">SPOP</a>或者<a href="/commands/srandmember">SRANDMEMBER</a>命令随机地获取元素。</li>
        <li>查看完整的<a href="/commands#set">集合命令列表</a>获取更多的信息。</li>
        </ul>
        
        
        <p><a name="hashes"></a></p>
        
        <h2>哈希（Hashes）</h2>
        
        <p>Redis Hashes是字符串字段和字符串值之间的映射，所以它们是完美的表示对象（eg:一个有名，姓，年龄等属性的用户）的数据类型。</p>
        
        <div class='example' data-session='b8f5d63e3620400649f708ef092b5f18'>
          <span class='monospace prompt'>redis>&nbsp;</span>
          <span class='monospace command'>HMSET user:1000 username antirez password P1pp0 age 34</span>
          <pre>OK</pre>
          <span class='monospace prompt'>redis>&nbsp;</span>
          <span class='monospace command'>HGETALL user:1000</span>
          <pre>1) "username"&#x000A;2) "antirez"&#x000A;3) "password"&#x000A;4) "P1pp0"&#x000A;5) "age"&#x000A;6) "34"</pre>
          <span class='monospace prompt'>redis>&nbsp;</span>
          <span class='monospace command'>HSET user:1000 password 12345</span>
          <pre>(integer) 0</pre>
          <span class='monospace prompt'>redis>&nbsp;</span>
          <span class='monospace command'>HGETALL user:1000</span>
          <pre>1) "username"&#x000A;2) "antirez"&#x000A;3) "password"&#x000A;4) "12345"&#x000A;5) "age"&#x000A;6) "34"</pre><form>
            <span class='monospace prompt'>redis>&nbsp;</span>
            <input autocomplete='off' name='command' spellcheck='false' type='text' />
          </form></div>
        
        
        <p>一个拥有少量（100个左右）字段的hash需要
		很少的空间来存储，所有你可以在一个小型的
		Redis实例中存储上百万的对象。</p>
        
        <p>尽管Hashes主要用来表示对象，但它们也能够存储许多元素，所以你也可以用Hashes来完成许多其他的任务。</p>
        
        <p>一个hash最多可以包含2<sup>32-1</sup> 字段-值对（超过40亿）。</p>
        
        <p>查看完整的<a href="/commands#hash">Hash命令列表</a>获取更多信息。</p>
        
        <p><a name="sorted-sets"></a></p>
        
        <h2>有序集合（Sorted sets）</h2>
        
        <p>Redis有序集合和Redis集合类似，是不包含
		相同字符串的合集。它们的差别是，每个有序集合
		的成员都关联着一个评分，这个评分用于把有序集
		合中的成员按最低分到最高分排列。</p>
        
        <p>使用有序集合，你可以非常快地（<span class="math">O(log(N))</span>）完成添加，删除和更新元素的操作。
		因为元素是在<em>插入时就排好序</em>的，所以很快地通过评分(score)或者
		位次(position)获得一个范围的元素。
        访问有序集合的中间元素同样也是非常快的，因此你可以使用有序集合作为一个没用重复成员的智能列表。
		在这个列表中，
		你可以轻易地访问任何你需要的东西:
		有序的元素，快速的存在性测试，快速访问集合中间元素！</p>
        
        <p>简而言之，使用有序集合你可以很好地完成
		很多在其他数据库中难以实现的任务。</p>
        
        <p>使用有序集合你可以：</p>
        
        <ul>
        <li>在一个巨型在线游戏中建立一个排行榜，每当有新的记录产生时，使用<a href="/commands/zadd">ZADD</a>
		来更新它。你可以用<a href="/commands/zrange">ZRANGE</a>轻松地获取排名靠前的用户，
        你也可以提供一个用户名，然后用<a href="/commands/zrank">ZRANK</a>获取他在排行榜中的名次。
        同时使用ZRANK和ZRANGE你可以获得与指定用户有相同分数的用户名单。
        所有这些操作都非常<em>迅速</em>。</li>
        <li>有序集合通常用来索引存储在Redis中的数据。
        例如：如果你有很多的hash来表示用户，那么你可以使用一个有序集合，这个集合的年龄字段用来当作评分，用户ID当作值。用<a href="/commands/zrangebyscore">ZRANGEBYSCORE</a>可以简单快速地检索到给定年龄段的所有用户。</li>
        <li>有序集合或许是最高级的Redis数据类型，所以花些时间查看完整的<a href="/commands#sorted_set">有序集合命令列表</a>去探索你能用Redis干些什么吧！</li>
        </ul>
      </article>
    </div>
    
    <div class='text' id='comments'>
      <div id='disqus_thread'></div>
      <script type='text/javascript'>
        //<![CDATA[
          var disqus_shortname = 'rediscn';
          
          /* * * DON'T EDIT BELOW THIS LINE * * */
          (function() {
            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
              dsq.src = 'http://' + disqus_shortname + '.disqus.com/embed.js';
              (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
          })();
        //]]>
      </script>
      <a class='dsq-brlink' href='http://disqus.com'>
        Comments powered by
        <span class='logo-disqus'>
          Disqus
        </span>
      </a>
    </div>
    
    <script src='/js/foot.js'></script>
  </body>
</html>
